home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / ebsx130 / jisconv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-07  |  8.4 KB  |  396 lines

  1. /* kenji suzuki */
  2. /* JIS to shift-JIS converter for 広辞苑 */
  3.  
  4. #include "common.h"
  5.  
  6. #include <iocslib.h>
  7. /* #include <stdio.h> */
  8. #include <method\Dos_i.h>
  9.  
  10. int    steps;        /* kenji suzuki */
  11.  
  12. static    unsigned int get_int( void )
  13. {
  14.     unsigned int c;
  15.  
  16.     DOSREAD( cdfile , &c     , sizeof( unsigned int ) );
  17.     steps+=4;
  18.  
  19.     return( c );
  20. };
  21.  
  22. static    unsigned short get_short( void )
  23. {
  24.     unsigned short c;
  25.  
  26.     DOSREAD( cdfile , &c     , sizeof( unsigned short ) );
  27.     steps+=2;
  28.  
  29.     return( c );
  30. };
  31.  
  32. static    unsigned char get_char( void )
  33. {
  34.     unsigned char c;
  35.  
  36.     DOSREAD( cdfile , &c     , sizeof( unsigned char ) );
  37.     steps++;
  38.  
  39.     return( c );
  40. };
  41.  
  42. static    int jis2ank(int c)
  43. {
  44.     int    ch,cc;
  45.     ch=c&0xff;
  46.     cc=0xffff0000+'?';
  47.     if ((c&0x2300)==0x2300) {
  48.         cc=ch;
  49.     } else if ((c&0x2100)==0x2100) {
  50.         switch (ch) {
  51.             case 0x21: cc=' '; break;
  52.             case 0x27: cc=':'; break;
  53.             case 0x28: cc=';'; break;
  54.             case 0x29: cc='?'; break;
  55.             case 0x2a: cc='!'; break;
  56.             case 0x3c:
  57.             case 0x3d:
  58.             case 0x3e: cc='-'; break;
  59.             case 0x3f: cc='/'; break;
  60.             case 0x5c: cc='+'; break;
  61.             case 0x5d: cc='-'; break;
  62.             case 0x70: cc='$'; break;
  63.             case 0x73: cc='%'; break;
  64.             case 0x74: cc='#'; break;
  65.             case 0x75: cc='&'; break;
  66.             case 0x76: cc='*'; break;
  67.             case 0x77: cc='@'; break;
  68.             case 0x7e: cc='  '; break;
  69.         }
  70.     }
  71.     return cc;
  72. }
  73.  
  74. /* original char* jis2shift(jischar *str , char *op, size_l length, int type) */
  75. int jis2shift(char *op, size_l length, int type , int *nextflg )
  76. {
  77.     int    code;    /* kenji suzuki */
  78.     jischar    c,ch;
  79.     int    k;
  80.     char    *p=op;
  81.     char    zenkaku=1;
  82.     jischar s1,s2,s3,s4;    /* kenji suzuki */
  83.     jischar    gra_x = 256;    /* kenji suzuki  */
  84.     jischar    gra_y = 200;    /* kenji suzuki  */
  85.     int    count;        /* kenji suzuki */
  86.     unsigned char flg;
  87.     unsigned char cb;
  88.     unsigned char ccode;
  89.  
  90.     int cnt;
  91.     int endflg;
  92.     unsigned short arw = '◎';
  93.  
  94.     /* 97/5/1 epwing */
  95.     int indexnum;
  96.     unsigned char num , num2;
  97.     unsigned int  wk;
  98.  
  99.     *nextflg = 1;
  100.     steps = 0;
  101.     endflg = 0;
  102. /*
  103.     c = get_short( );
  104.     DOSSEEK( cdfile , -2 , SEEK_CUR );
  105. */
  106.     for (;;) {
  107. /* kenji suzuki */
  108.         if( e_key == 0 )
  109.         {
  110.             c = get_short( );
  111.             cb = (unsigned char)( c >> 8 );
  112.             flg = ( c & 0x00ff );
  113.         } else {
  114.             cb = get_char( );
  115.         };
  116. /* original    c=*str++; */
  117.         if (cb==0x1f) {
  118.             if( e_key == 1 )
  119.             {
  120.                 flg = get_char( );
  121.             };
  122.             switch (flg) {
  123.                 case 0x02: break;
  124.                 case 0x03: 
  125.                     *nextflg = 0;
  126.                     *p++=0;
  127.                     return steps;
  128.                 case 0x04:
  129.                     zenkaku=0; break;
  130.                 case 0x05:
  131.                     zenkaku=1; break;
  132. /* kenji suzuki */        case 0x06:
  133.                     break;
  134. /* kenji suzuki */        case 0x07:
  135.                     break;
  136.                 case 0x09:
  137. /* kenji suzuki */
  138.                     c = get_short( );
  139. /* original                c=*str++;
  140.                     if(c!=1&&c!=5)printf("(1f09:%x)",c); */
  141.                     if (c==1) {
  142.                         if( endflg == 0 )
  143.                         {
  144.                             endflg = 9;    /* 最初にみつかった物は無視 */
  145.                         } else if( endflg == 9 )
  146.                         {
  147.                             *p++=0;
  148.                             return steps-4;    /* 2番目でリターン */
  149.                         };
  150.                     }
  151.                     break;
  152.                 case 0x0a:
  153. /* original                if (type!=0) { */
  154. /* kenji suzuki */            if (type==0) {
  155.                         *p++=0x0d, *p++=0x0a;
  156.                         break;
  157.                     }
  158.                     *p++=0;
  159.                     return steps;
  160. /* kenji suzuki */        case 0x0e:
  161.                     break;
  162. /* kenji suzuki */        case 0x0f:
  163.                     break;
  164. /* kenji suzuki */        case 0x10:
  165.                     break;
  166. /* kenji suzuki */        case 0x11:
  167.                     break;
  168.                 case 0x41:        /* ポイントの切りかえ? */
  169. /* kenji suzuki */
  170.                     if( endflg == 0 )
  171.                     {
  172.                         c = get_short( );
  173.                         endflg = 41;    /* 最初にみつかった物は無視 */
  174.                     } else if( endflg == 41 )
  175.                     {
  176.                         *p++=0;
  177.                         return steps-2;    /* 2番目でリターン */
  178.                     } else {
  179.                         c = get_short( );
  180.                     };
  181. /* original                *str++; */
  182.                     break;
  183.                 case 0x61:        /* ポイントを元に戻す? */
  184.             /*        *p++='(',*p++='6',*p++='1',*p++=')';
  185.             */        break;
  186.                 case 0x42:
  187.                     break;
  188.                 case 0x62:
  189. /* kenji suzuki 参照 */
  190.                     DOSSEEK( cdfile , 6 , SEEK_CUR );
  191.                     steps+=6;
  192.                     break;
  193.                 case 0x43:
  194.                     break;
  195.                 case 0x63:
  196. /* kenji suzuki メニュー */
  197.                     DOSSEEK( cdfile , 6 , SEEK_CUR );
  198.                     steps+=6;
  199.                     break;
  200. /* kenji suzuki */        case 0x45:
  201.                     DOSSEEK( cdfile , 2 , SEEK_CUR );
  202.                     steps+=2;
  203.                     count = 0;
  204.                     break;
  205. /* kenji suzuki */        case 0x65:
  206.                     break;
  207. /* kenji suzuki */        case 0x31:    /* サイズ */
  208.                     DOSSEEK( cdfile , 6 , SEEK_CUR );
  209.                     steps+=6;
  210.                     break;
  211. /* kenji suzuki */        case 0x51:
  212.                     break;
  213. /* kenji suzuki */        case 0x32:
  214.                     break;
  215. /* kenji suzuki グラフィック? */    case 0x52:
  216.                     DOSSEEK( cdfile , 6 , SEEK_CUR );
  217.                     steps+=6;
  218.                     break;
  219. /* kenji suzuki 音声? */    case 0x33:    /* ファイル型? */
  220.                     break;
  221. /* kenji suzuki */        case 0x53:
  222.                     DOSSEEK( cdfile , 8 , SEEK_CUR );
  223.                     steps+=8;
  224.                     break;
  225. /* kenji suzuki 音声? */    case 0x34:    /* トラック型? */
  226.                     break;
  227. /* kenji suzuki */        case 0x54:
  228.                     DOSSEEK( cdfile , 8 , SEEK_CUR );
  229.                     steps+=8;
  230.                     break;
  231. /* 97/5/1 epwing */
  232.                 case 0x0b:
  233.                     break;
  234.                 case 0x0c:
  235.                     break;
  236.                 case 0x14:
  237.                     DOSSEEK( cdfile , 4 , SEEK_CUR );
  238.                     break;
  239.                 case 0x15:
  240.                     break;
  241. /* サイズ */            case 0x44:
  242.                     DOSSEEK( cdfile , 10 , SEEK_CUR );
  243.                     break;
  244. /* グラフィック */        case 0x64:
  245.                     DOSSEEK( cdfile , 6 , SEEK_CUR );
  246.                     break;
  247.                 case 0x47:
  248.                     break;
  249. /*  */                case 0x67:
  250.                     num = get_char( );
  251.                     while( num == 0x1e )
  252.                     {
  253.                         num2 = get_char( );
  254.                     };
  255.                     DOSSEEK( cdfile , -1 , SEEK_CUR );
  256.                     steps--;
  257.                     break;
  258.                 case 0x4a:
  259.                     DOSSEEK( cdfile , 16 , SEEK_CUR );
  260.                     break;
  261.                 case 0x6a:
  262.                     break;
  263.                 case 0x4d:
  264.                     DOSSEEK( cdfile , 18 , SEEK_CUR );
  265.                     break;
  266.                 case 0x6d:
  267.                     break;
  268. /* 0d,12,13,4b,4c,6b,6cは */    case 0x0d:
  269. /* 実際には見たことはない */        break;
  270. /* けど一応入れておく */    case 0x12:
  271.                     break;
  272.                 case 0x13:
  273.                     break;
  274.                 case 0x4b:
  275.                     break;
  276.                 case 0x6b:
  277.                     break;
  278.                 case 0x4c:
  279.                     break;
  280.                 case 0x6c:
  281.                     break;
  282.  
  283.                 default:
  284. /* kenji suzuki */
  285.                     DOSSEEK( cdfile , 10 , SEEK_CUR );
  286.                     steps+=10;
  287. /*                    printf("(%x:%x,%x,%x,%x)",c,s1,s2,s3,s4); */
  288. /* original                printf("[%x,%x,%x,%x,%x]",
  289.                         c,*str,*(str+1),*(str+2),*(str+3)); */
  290.                     *p++=0;
  291.                     return steps;
  292.             }
  293.         } else {
  294. /* orignal        if (c==0xa169) ch=k=0x8391;  */  /* 'ヱ' */
  295. /* orignal        else if (c==0xa168) ch=k=0x8390;  */  /* 'ヰ' */
  296.  
  297.             if( e_key == 0 )
  298.             {
  299.  
  300. /* kenji suzuki */        if( c >= f1jisst && c <= f1jised )
  301. /* 全角外字の表示 */             {
  302.                     ch = 0;
  303.                     if( c <= f1jismax )
  304.                     {
  305.                         if( c >= f1jisst+0x100 )
  306.                             code = c - ( f1jisst+0x100 ) + 94;
  307.                         else
  308.                             code = c - f1jisst;
  309.                         *p++ = (char)( codetbl1[ code ] >> 8 );
  310.                         *p++ = (char)( codetbl1[ code ] & 0x00ff );
  311.                     } else {
  312.                         *p++ = ' ';
  313.                         *p++ = ' ';
  314.                     };
  315.                      }
  316. /* kenji suzuki */        else if( c >= f2jisst && c <= f2jised )
  317. /* 半角外字の表示 */             {
  318.                     ch = 0;
  319.                     if( c <= f2jismax )
  320.                     {
  321.                         if( c >= f2jisst+0x100 )
  322.                             code = c - ( f2jisst+0x100 ) + 94;
  323.                         else
  324.                             code = c - f2jisst;
  325.                         *p++ = (char)( codetbl2[ code ] >> 8 );
  326.                         *p++ = (char)( codetbl2[ code ] & 0x00ff );
  327.                     } else {
  328.                         *p++ = ' ';
  329.                         *p++ = ' ';
  330.                     };
  331.                      }
  332.                 else if (0xb536<=c&&c<=0xb545) {
  333.                     ch=0;
  334.                     *p++='(';
  335.                     if (c>0xb536+9-1) *p++='1';
  336.                     *p++=((c-0xb536+1)%10)+'0';
  337.                     *p++=')';
  338.                 } else ch=k=JISSFT(c);
  339.     /*            if (k<0) {
  340.                     printf(":%4x.%4x:",*(str-2),c);
  341.                     ch=('?'<<8)+'?';
  342.                 }
  343.     */
  344.             } else {
  345.                  if( cb == f2esc  )        /* 範囲はこれで良いのか */
  346. /* 半角外字の表示 */        {
  347.                     ch = 0;
  348.                     ccode = get_char( );
  349.                     if( ccode <= f2ascmax )
  350.                     {
  351.                         *p++ = (char)( codetblebg[ ccode ] >> 8 );
  352.                         *p++ = (char)( codetblebg[ ccode ] & 0x00ff );
  353.                     } else {
  354.                         *p++ = ' ';
  355.                     };
  356.                 } 
  357.                 else if( cb >= 0x80 )    /* 0x80以上はどんな文字か判らないのでスペースを表示 */
  358.                 {
  359.                     ch = ' ';
  360.                 } else {
  361.                     ch = cb;
  362.                 };
  363.             };
  364.             if (ch) {
  365.                 if( e_key == 0 )
  366.                 {
  367.                     if (!(c==0x2121 ||(c&0xff00)==0x2300) || zenkaku) {
  368.                         *p++=ch>>8;
  369.                         *p++=ch;
  370.                     } else {
  371.                         *p++=jis2ank(c);
  372.                     };
  373.                 } else {
  374.                     *p++=ch;
  375.                 }
  376.             }
  377.         }
  378.     }
  379. }
  380.  
  381. /*
  382. #include <stdio.h>
  383. wchar    instr[50000];
  384. char    outstr[100000];
  385. int main(int argc, char *argv[])
  386. {
  387.     FILE    *fp;
  388.     char    *cp;
  389.     fp=fopen(argv[1],"r"); if (fp==NULL) return 1;
  390.     DOSREAD(instr,1,sizeof(instr),fp);
  391.     jis2shift(instr,outstr,sizeof(outstr));
  392.     cp=outstr;
  393.     while ( *cp ) putchar(*cp++);
  394. }
  395. */
  396.